//
//  Perfect_Bridge.h
//  HelloWorld
//
//  Created by Kevin Tang on 31/12/14.
//  Copyright (c) 2014年 Kevin Tang. All rights reserved.
//

#ifndef __HelloWorld__Perfect_Bridge__
#define __HelloWorld__Perfect_Bridge__
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
//还是汽车公路问题
namespace perfectBridge {
    void test_perfect();
    //桥接模式的应用：当你有两个类，两个类都会派生出很多子类,而两个类的对象又交叉着
    //用于解决问题：有多个维度的变化
    //比如:
    //有一个交通工具，它有很多子类:小汽车，老爷车，大卡车，自行车.....
    //有一个道路类,它有很多子类:高速路，泥泞路，行人道，街道.....
    //我们希望这些车，在道路开放后，都要在这些路上跑。
    //如何能做到，增加路的时候，不需要修改原有的车类，车类可以很好的适用于这些路类
    //另外，增加车的时候，不需要对原有的路类进行修改.
    
    //桥接模式的关键是：运用了对象聚合，而不是继承，使得各自的修改，互不影响.
    
    //我们的思路是：
    //1:抽象一个路类，然后具体路的子类，捅有一个抽象车类的指针
    //2:抽象一个车类，然后具体车的子类，实现抽象车的共有方法
    
    using namespace::boost;
    class AbStractRoad
    {
    public:
        AbStractRoad();
        virtual ~AbStractRoad();//这里把释构函数声明成，虚释构，是为了删除指向子类对象的基类指针时，能调用到子类对象的释构函数
        virtual void OpenRoad()=0;//纯虚方法，子类都要实现这个方法，所以的子类都捅有这个共性
    };
    
    class AbStractTransport
    {
    public:
        AbStractTransport();
        virtual ~AbStractTransport();//同上
        virtual void Run()=0;//同上
    };
    
    //现在我们有一个高速路类,希望所有车都能在这条路上跑
    class HighRoad:public AbStractRoad
    {
    private:
        AbStractTransport *mSport;//一个基类指针，且是一个智能指针，即可以自动释放对象
    public:
        HighRoad(AbStractTransport* transport);
        ~HighRoad();
        void OpenRoad();
    };
    //这是一条街道
    class StreetRoad:public AbStractRoad
    {
    private:
        AbStractTransport* mSport;//一个基类指针，且是一个智能指针，即可以自动释放对象
        shared_ptr<AbStractTransport> mTransport;
    protected:
        
    public:
        StreetRoad(AbStractTransport* transport);
        StreetRoad();
        ~StreetRoad();
        
        void Set(shared_ptr<AbStractTransport> transport);
        
        void OpenRoad();
    };
    //我们还可以增加其他的路。
    
    
    
    
    //这是一辆小汽车,希望可以在所有的路上可以跑
    class Car:public AbStractTransport
    {
    public:
        Car();
        ~Car();
        void Run();
    };
    //这是一辆公共汽车,希望可以在所有路上行驶,
    class Bus:public AbStractTransport
    {
    public:
        static shared_ptr<AbStractTransport> Create();
        Bus();
        ~Bus();
        void Run();
    };
    //这里随意增加其他汽车


}




#endif /* defined(__HelloWorld__Perfect_Bridge__) */
